{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# All pre-processing needed for model input data\n",
    "### Summary:\n",
    "input: MTL Trajet 2016 & MTL Trajet 2017   \n",
    "output: model_inputs (X and y) \n",
    "\n",
    "### Content:\n",
    "0. Library imports\n",
    "1. Load in, clean, translate and re-project data\n",
    "2. Merge weather data\n",
    "3. Calculate distance and duration\n",
    "4. Add time-interval binary variables\n",
    "5. Create and export model inputs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 0. Import required libraries"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "import geopandas as gpd\n",
    "import shapely\n",
    "import shapely.wkt as wkt\n",
    "import seaborn as sns\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import datetime\n",
    "import sys\n",
    "import re\n",
    "sys.path.append('../../Scripts/') # link to scripts\n",
    "import preprocessing.translate   # import translation scripts from preprocessing\n",
    "import utils.spatial_utils\n",
    "import utils.temporal_utils\n",
    "import preprocessing.create_metrics\n",
    "\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to the MTL Trajet data \n",
    "path_2016 = \"../../Data/mtl_trajet/mtl_trajet_2016.shp\"\n",
    "path_2017 = \"../../Data/mtl_trajet/trajets_mtl_trajet_2017.shp\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 1. Load in, clean, translate and re-project data  \n",
    "\n",
    "\n",
    "## 1.1 Translate and re-project data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "initialising crs\n"
     ]
    }
   ],
   "source": [
    "gdf_2016 = preprocessing.translate.translate_data(path_2016)\n",
    "gdf_2017 = preprocessing.translate.translate_data(path_2017)\n",
    "\n",
    "# initalise the CRS\n",
    "if gdf_2016.crs == {}:\n",
    "    print(\"initialising crs\")\n",
    "    gdf_2016.crs = {'init': 'epsg:4326'}\n",
    "    \n",
    "if gdf_2017.crs == {}:\n",
    "    print(\"initialising crs\")\n",
    "    gdf_2017.crs = {'init': 'epsg:4326'}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "# calculate the bounding box \n",
    "used_data = gdf_2017\n",
    "for i in range(len(used_data)):\n",
    "    if i == 0:\n",
    "        min_lon, min_lat, max_lon, max_lat = used_data['geometry'][i].bounds\n",
    "    else:\n",
    "        lon1, lat1, lon2, lat2 = used_data['geometry'][i].bounds\n",
    "        if lon1 < min_lon:\n",
    "            min_lon = lon1\n",
    "        elif lat1 < min_lat:\n",
    "            min_lat = lat1\n",
    "        if lon1 > max_lon:\n",
    "            max_lon = lon2\n",
    "        elif lat1 > max_lat:\n",
    "            max_lat = lat2\n",
    "        "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-74.314814, 45.230252, -72.82648600000002, 45.999661)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "min_lon, min_lat, max_lon, max_lat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(45.230252, 45.999661)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "gdf_2017.plot()\n",
    "\n",
    "plt.xlim(min_lon,max_lon)\n",
    "plt.ylim(min_lat, max_lat)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-74.314814, 45.230252, -72.82648600000002, 45.999661)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "min_lon, min_lat, max_lon, max_lat"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "translating data\n",
      "translating data\n"
     ]
    }
   ],
   "source": [
    "# reproject data\n",
    "if not gdf_2016.crs == {'init': 'epsg:3347'}:\n",
    "    gdf_2016 = utils.spatial_utils.change_projection(gdf_2016)\n",
    "    \n",
    "if not gdf_2017.crs == {'init': 'epsg:3347'}:\n",
    "    gdf_2017 = utils.spatial_utils.change_projection(gdf_2017)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "converting start and end timestamps to datetime objects\n",
      "converting start and end timestamps to datetime objects\n"
     ]
    }
   ],
   "source": [
    "# remove timezone \n",
    "gdf_2016 = utils.temporal_utils.remove_timezone(gdf_2016)\n",
    "gdf_2017 = utils.temporal_utils.remove_timezone(gdf_2017)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1724206</td>\n",
       "      <td>4.4</td>\n",
       "      <td>460</td>\n",
       "      <td>walking</td>\n",
       "      <td>returning_home</td>\n",
       "      <td>12</td>\n",
       "      <td>[{\"id\": 1150192, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-07 20:37:26</td>\n",
       "      <td>2016-09-07 20:45:06</td>\n",
       "      <td>LINESTRING (7628287.236741193 1247680.17623496...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1724208</td>\n",
       "      <td>10.7</td>\n",
       "      <td>2146</td>\n",
       "      <td>combination</td>\n",
       "      <td>work</td>\n",
       "      <td>120</td>\n",
       "      <td>[{\"id\": 1140016, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 07:43:23</td>\n",
       "      <td>2016-09-08 08:19:09</td>\n",
       "      <td>LINESTRING (7627830.06960756 1247172.275532002...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  avg_speed  duration         mode         purpose  n_coord  \\\n",
       "0  1724206        4.4       460      walking  returning_home       12   \n",
       "1  1724208       10.7      2146  combination            work      120   \n",
       "\n",
       "                                            segments           starttime  \\\n",
       "0  [{\"id\": 1150192, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-07 20:37:26   \n",
       "1  [{\"id\": 1140016, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-08 07:43:23   \n",
       "\n",
       "              endtime                                           geometry  \n",
       "0 2016-09-07 20:45:06  LINESTRING (7628287.236741193 1247680.17623496...  \n",
       "1 2016-09-08 08:19:09  LINESTRING (7627830.06960756 1247172.275532002...  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.2 remove mode purpose not shared between both years"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "# create sets\n",
    "set_2016_md = set(gdf_2016['mode'].unique())\n",
    "set_2017_md = set(gdf_2017['mode'].unique())\n",
    "\n",
    "set_2016_pur = set(gdf_2016['purpose'].unique())\n",
    "set_2017_pur = set(gdf_2017['purpose'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "mode_not_in_2016 = list(set_2017_md.difference(set_2016_md))\n",
    "purpose_not_in_2016 = list(set_2017_pur.difference(set_2016_pur))\n",
    "mode_not_in_2017 = list(set_2016_md.difference(set_2017_md))\n",
    "purpose_not_in_2017 = list(set_2016_pur.difference(set_2017_pur))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10737"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# mode values to drop\n",
    "len(gdf_2017.loc[(gdf_2017['mode'].apply(lambda row: row in mode_not_in_2016))])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1244"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# purpose values to drop\n",
    "len(gdf_2017.loc[(gdf_2017['purpose'].apply(lambda row: row in purpose_not_in_2016))])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['not_available', 'other']"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "purpose_not_in_2016"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['car_sharing, public_transport',\n",
       " 'walking, public_transport, cycling',\n",
       " 'walking, car_sharing, public_transport',\n",
       " 'walking, public_transport, car',\n",
       " 'walking, car_sharing, other, public_transport',\n",
       " '...']"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mode_not_in_2016[:5] + ['...']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['combination']"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "mode_not_in_2017"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10256"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## total trips were multi-mode is chosen\n",
    "len(np.where(gdf_2017.dropna()['mode'].apply(lambda row: ',' in row))[0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [],
   "source": [
    "## get all values where mode and purpose are in 2016 and 2017 and not None\n",
    "gdf_2016 = gdf_2016.loc[(gdf_2016['purpose'].apply(lambda row: row not in list(purpose_not_in_2017)))&\n",
    "             (gdf_2016['mode'].apply(lambda row: row not in list(mode_not_in_2017)))&\n",
    "             (gdf_2016['purpose'])&(gdf_2016['mode'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "## get all values where mode and purpose are in 2016 and 2017 and not None\n",
    "gdf_2017 = gdf_2017.loc[(gdf_2017['purpose'].apply(lambda row: row not in list(purpose_not_in_2016)))&\n",
    "             (gdf_2017['mode'].apply(lambda row: row not in list(mode_not_in_2016)))&\n",
    "             (gdf_2017['purpose'])&(gdf_2017['mode'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "56500\n",
      "62421\n"
     ]
    }
   ],
   "source": [
    "print(len(gdf_2016)) # 56500\n",
    "print(len(gdf_2017)) # 62421"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.3 Remove Work & Return Home trips\n",
    "Removed as these trip are by far the largest classes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "returning_home      15598\n",
       "work                15020\n",
       "leisure              7459\n",
       "food_drink           5811\n",
       "shops                5691\n",
       "pick_up_drop_off     2480\n",
       "education            2272\n",
       "health               2169\n",
       "Name: purpose, dtype: int64"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016['purpose'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "returning_home      22815\n",
       "work                16107\n",
       "leisure              8259\n",
       "shops                7909\n",
       "food_drink           2789\n",
       "education            2223\n",
       "pick_up_drop_off     1398\n",
       "health                921\n",
       "Name: purpose, dtype: int64"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2017['purpose'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016 = gdf_2016.loc[~(gdf_2016['purpose'].isin(['work','returning_home']))]\n",
    "gdf_2017 = gdf_2017.loc[~(gdf_2017['purpose'].isin(['work','returning_home']))]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25882\n",
      "23499\n"
     ]
    }
   ],
   "source": [
    "print(len(gdf_2016)) # 25882\n",
    "print(len(gdf_2017)) # 23499"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1.4 calculate X & Y of end points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1min 31s, sys: 416 ms, total: 1min 31s\n",
      "Wall time: 1min 33s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "## calculate start and end points (Canada Lambert)\n",
    "gdf_2016['start_can'] =  gdf_2016.geometry.apply(utils.spatial_utils.get_point_from_linestring, X=0)\n",
    "gdf_2016['start_can'] = gdf_2016['start_can'].apply(shapely.geometry.Point)\n",
    "gdf_2016['end_can'] =  gdf_2016.geometry.apply(utils.spatial_utils.get_point_from_linestring, X=-1)\n",
    "gdf_2016['end_can'] = gdf_2016['end_can'].apply(shapely.geometry.Point)\n",
    "\n",
    "## calculate start and end points (Canada Lambert)\n",
    "gdf_2017['start_can'] =  gdf_2017.geometry.apply(utils.spatial_utils.get_point_from_linestring, X=0)\n",
    "gdf_2017['start_can'] = gdf_2017['start_can'].apply(shapely.geometry.Point)\n",
    "gdf_2017['end_can'] =  gdf_2017.geometry.apply(utils.spatial_utils.get_point_from_linestring, X=-1)\n",
    "gdf_2017['end_can'] = gdf_2017['end_can'].apply(shapely.geometry.Point)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016['startx'] = gdf_2016.start_can.apply(lambda row: row.x)\n",
    "gdf_2016['starty'] = gdf_2016.start_can.apply(lambda row: row.y)\n",
    "gdf_2016['endx'] = gdf_2016.end_can.apply(lambda row: row.x)\n",
    "gdf_2016['endy'] = gdf_2016.end_can.apply(lambda row: row.y)\n",
    "\n",
    "gdf_2017['startx'] = gdf_2017.start_can.apply(lambda row: row.x)\n",
    "gdf_2017['starty'] = gdf_2017.start_can.apply(lambda row: row.y)\n",
    "gdf_2017['endx'] = gdf_2017.end_can.apply(lambda row: row.x)\n",
    "gdf_2017['endy'] = gdf_2017.end_can.apply(lambda row: row.y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1889461</td>\n",
       "      <td>15.4</td>\n",
       "      <td>447</td>\n",
       "      <td>public_transport</td>\n",
       "      <td>leisure</td>\n",
       "      <td>36</td>\n",
       "      <td>[{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 19:46:14</td>\n",
       "      <td>2016-09-08 19:53:41</td>\n",
       "      <td>LINESTRING (7632055.840015979 1247584.15415876...</td>\n",
       "      <td>POINT (7632055.840015979 1247584.154158766)</td>\n",
       "      <td>POINT (7630297.958008133 1248128.900960702)</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>1.247584e+06</td>\n",
       "      <td>7.630298e+06</td>\n",
       "      <td>1.248129e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2071991</td>\n",
       "      <td>12.4</td>\n",
       "      <td>844</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>56</td>\n",
       "      <td>[{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 18:22:22</td>\n",
       "      <td>2016-09-09 18:36:26</td>\n",
       "      <td>LINESTRING (7628002.075274516 1247761.31724215...</td>\n",
       "      <td>POINT (7628002.075274516 1247761.317242159)</td>\n",
       "      <td>POINT (7626229.644805724 1247149.931923385)</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>1.247761e+06</td>\n",
       "      <td>7.626230e+06</td>\n",
       "      <td>1.247150e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>1667922</td>\n",
       "      <td>4.2</td>\n",
       "      <td>1211</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>29</td>\n",
       "      <td>[{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 23:41:59</td>\n",
       "      <td>2016-09-10 00:02:10</td>\n",
       "      <td>LINESTRING (7628517.528697006 1246292.61362129...</td>\n",
       "      <td>POINT (7628517.528697006 1246292.613621292)</td>\n",
       "      <td>POINT (7629431.778009223 1246198.082987975)</td>\n",
       "      <td>7.628518e+06</td>\n",
       "      <td>1.246293e+06</td>\n",
       "      <td>7.629432e+06</td>\n",
       "      <td>1.246198e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>2072003</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1266</td>\n",
       "      <td>walking</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>34</td>\n",
       "      <td>[{\"id\": 5640, \"source\": \"reseau_cyclable\"}, {\"...</td>\n",
       "      <td>2016-09-10 10:29:44</td>\n",
       "      <td>2016-09-10 10:50:50</td>\n",
       "      <td>LINESTRING (7628222.927915867 1247461.40768243...</td>\n",
       "      <td>POINT (7628222.927915867 1247461.407682439)</td>\n",
       "      <td>POINT (7628197.239168104 1246306.4389528)</td>\n",
       "      <td>7.628223e+06</td>\n",
       "      <td>1.247461e+06</td>\n",
       "      <td>7.628197e+06</td>\n",
       "      <td>1.246306e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>2072007</td>\n",
       "      <td>4.5</td>\n",
       "      <td>603</td>\n",
       "      <td>walking</td>\n",
       "      <td>leisure</td>\n",
       "      <td>16</td>\n",
       "      <td>[{\"id\": 1240255, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-10 13:06:26</td>\n",
       "      <td>2016-09-10 13:16:29</td>\n",
       "      <td>LINESTRING (7629631.088157224 1245856.46655086...</td>\n",
       "      <td>POINT (7629631.088157224 1245856.466550862)</td>\n",
       "      <td>POINT (7630013.081349936 1245629.212225115)</td>\n",
       "      <td>7.629631e+06</td>\n",
       "      <td>1.245856e+06</td>\n",
       "      <td>7.630013e+06</td>\n",
       "      <td>1.245629e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    id_trip  avg_speed  duration              mode     purpose  n_coord  \\\n",
       "2   1889461       15.4       447  public_transport     leisure       36   \n",
       "5   2071991       12.4       844           cycling  food_drink       56   \n",
       "6   1667922        4.2      1211           cycling  food_drink       29   \n",
       "9   2072003        4.8      1266           walking  food_drink       34   \n",
       "10  2072007        4.5       603           walking     leisure       16   \n",
       "\n",
       "                                             segments           starttime  \\\n",
       "2   [{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-08 19:46:14   \n",
       "5   [{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 18:22:22   \n",
       "6   [{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 23:41:59   \n",
       "9   [{\"id\": 5640, \"source\": \"reseau_cyclable\"}, {\"... 2016-09-10 10:29:44   \n",
       "10  [{\"id\": 1240255, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-10 13:06:26   \n",
       "\n",
       "               endtime                                           geometry  \\\n",
       "2  2016-09-08 19:53:41  LINESTRING (7632055.840015979 1247584.15415876...   \n",
       "5  2016-09-09 18:36:26  LINESTRING (7628002.075274516 1247761.31724215...   \n",
       "6  2016-09-10 00:02:10  LINESTRING (7628517.528697006 1246292.61362129...   \n",
       "9  2016-09-10 10:50:50  LINESTRING (7628222.927915867 1247461.40768243...   \n",
       "10 2016-09-10 13:16:29  LINESTRING (7629631.088157224 1245856.46655086...   \n",
       "\n",
       "                                      start_can  \\\n",
       "2   POINT (7632055.840015979 1247584.154158766)   \n",
       "5   POINT (7628002.075274516 1247761.317242159)   \n",
       "6   POINT (7628517.528697006 1246292.613621292)   \n",
       "9   POINT (7628222.927915867 1247461.407682439)   \n",
       "10  POINT (7629631.088157224 1245856.466550862)   \n",
       "\n",
       "                                        end_can        startx        starty  \\\n",
       "2   POINT (7630297.958008133 1248128.900960702)  7.632056e+06  1.247584e+06   \n",
       "5   POINT (7626229.644805724 1247149.931923385)  7.628002e+06  1.247761e+06   \n",
       "6   POINT (7629431.778009223 1246198.082987975)  7.628518e+06  1.246293e+06   \n",
       "9     POINT (7628197.239168104 1246306.4389528)  7.628223e+06  1.247461e+06   \n",
       "10  POINT (7630013.081349936 1245629.212225115)  7.629631e+06  1.245856e+06   \n",
       "\n",
       "            endx          endy  \n",
       "2   7.630298e+06  1.248129e+06  \n",
       "5   7.626230e+06  1.247150e+06  \n",
       "6   7.629432e+06  1.246198e+06  \n",
       "9   7.628197e+06  1.246306e+06  \n",
       "10  7.630013e+06  1.245629e+06  "
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 2. Merge with weather data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [],
   "source": [
    "## see weather_data notebook for details"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [],
   "source": [
    "weather_data = pd.read_csv(\"../../Data/supplementary_data/weather/mtl_temp_prec.csv\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "metadata": {},
   "outputs": [],
   "source": [
    "weather_data['dt'] = weather_data['dt'].apply(pd.to_datetime)\n",
    "weather_data = weather_data.set_index('dt')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_weather_subset(row, weather_df):\n",
    "    assert type(weather_df.index) == pd.core.indexes.datetimes.DatetimeIndex, (\"the weather data needs a datetime index\")\n",
    "    \n",
    "    start = row['starttime']\n",
    "    end = row['endtime']\n",
    "    subset_weather = weather_df.loc[start.strftime(\"%Y-%m-%d %H:%M:%S\"):end.strftime(\"%Y-%m-%d %H:%M:%S\")]\n",
    "    if len(subset_weather) < 1:\n",
    "        start = start - datetime.timedelta(hours=1)\n",
    "        subset_weather = weather_df.loc[start.strftime(\"%Y-%m-%d %H:%M:%S\"):end.strftime(\"%Y-%m-%d %H:%M:%S\")]\n",
    "    return subset_weather\n",
    "\n",
    "def calc_mean_weather(subset):\n",
    "#     print(len(subset), \"hours worth of weather\")\n",
    "    return subset.precipitation.mean(), subset.temperature.mean()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CPU times: user 1min 28s, sys: 997 ms, total: 1min 29s\n",
      "Wall time: 1min 28s\n"
     ]
    }
   ],
   "source": [
    "%%time\n",
    "## apply average weather for trip to each row\n",
    "## takes 2 mins\n",
    "gdf_2016['av_weather'] = gdf_2016.apply(lambda row: calc_mean_weather(extract_weather_subset(row, weather_data)), axis=1)\n",
    "gdf_2017['av_weather'] = gdf_2017.apply(lambda row: calc_mean_weather(extract_weather_subset(row, weather_data)), axis=1)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "temp_prec_16 = gdf_2016.av_weather.apply(pd.Series)\n",
    "temp_prec_16.columns = ['precip','temp']\n",
    "\n",
    "temp_prec_17 = gdf_2017.av_weather.apply(pd.Series)\n",
    "temp_prec_17.columns = ['precip','temp']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016 = pd.concat([gdf_2016,temp_prec_16], axis=1)\n",
    "gdf_2017 = pd.concat([gdf_2017,temp_prec_17], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016 = gdf_2016.drop('av_weather',axis=1)\n",
    "gdf_2017 = gdf_2017.drop('av_weather',axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1889461</td>\n",
       "      <td>15.4</td>\n",
       "      <td>447</td>\n",
       "      <td>public_transport</td>\n",
       "      <td>leisure</td>\n",
       "      <td>36</td>\n",
       "      <td>[{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 19:46:14</td>\n",
       "      <td>2016-09-08 19:53:41</td>\n",
       "      <td>LINESTRING (7632055.840015979 1247584.15415876...</td>\n",
       "      <td>POINT (7632055.840015979 1247584.154158766)</td>\n",
       "      <td>POINT (7630297.958008133 1248128.900960702)</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>1.247584e+06</td>\n",
       "      <td>7.630298e+06</td>\n",
       "      <td>1.248129e+06</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>2071991</td>\n",
       "      <td>12.4</td>\n",
       "      <td>844</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>56</td>\n",
       "      <td>[{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 18:22:22</td>\n",
       "      <td>2016-09-09 18:36:26</td>\n",
       "      <td>LINESTRING (7628002.075274516 1247761.31724215...</td>\n",
       "      <td>POINT (7628002.075274516 1247761.317242159)</td>\n",
       "      <td>POINT (7626229.644805724 1247149.931923385)</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>1.247761e+06</td>\n",
       "      <td>7.626230e+06</td>\n",
       "      <td>1.247150e+06</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  avg_speed  duration              mode     purpose  n_coord  \\\n",
       "2  1889461       15.4       447  public_transport     leisure       36   \n",
       "5  2071991       12.4       844           cycling  food_drink       56   \n",
       "\n",
       "                                            segments           starttime  \\\n",
       "2  [{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-08 19:46:14   \n",
       "5  [{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 18:22:22   \n",
       "\n",
       "              endtime                                           geometry  \\\n",
       "2 2016-09-08 19:53:41  LINESTRING (7632055.840015979 1247584.15415876...   \n",
       "5 2016-09-09 18:36:26  LINESTRING (7628002.075274516 1247761.31724215...   \n",
       "\n",
       "                                     start_can  \\\n",
       "2  POINT (7632055.840015979 1247584.154158766)   \n",
       "5  POINT (7628002.075274516 1247761.317242159)   \n",
       "\n",
       "                                       end_can        startx        starty  \\\n",
       "2  POINT (7630297.958008133 1248128.900960702)  7.632056e+06  1.247584e+06   \n",
       "5  POINT (7626229.644805724 1247149.931923385)  7.628002e+06  1.247761e+06   \n",
       "\n",
       "           endx          endy    precip       temp  \n",
       "2  7.630298e+06  1.248129e+06  0.000134  25.844886  \n",
       "5  7.626230e+06  1.247150e+06  0.001427  24.930720  "
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>150744</td>\n",
       "      <td>car</td>\n",
       "      <td>pick_up_drop_off</td>\n",
       "      <td>2017-09-18 10:02:50</td>\n",
       "      <td>2017-09-18 10:17:12</td>\n",
       "      <td>LINESTRING (7624322.265039734 1247672.97005955...</td>\n",
       "      <td>POINT (7624322.265039734 1247672.970059557)</td>\n",
       "      <td>POINT (7631863.767736511 1250414.940902894)</td>\n",
       "      <td>7.624322e+06</td>\n",
       "      <td>1.247673e+06</td>\n",
       "      <td>7.631864e+06</td>\n",
       "      <td>1.250415e+06</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>16.910884</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>35763</td>\n",
       "      <td>car</td>\n",
       "      <td>shops</td>\n",
       "      <td>2017-09-18 11:32:54</td>\n",
       "      <td>2017-09-18 12:04:07</td>\n",
       "      <td>LINESTRING (7641918.591122853 1236660.83022969...</td>\n",
       "      <td>POINT (7641918.591122853 1236660.830229698)</td>\n",
       "      <td>POINT (7641940.751710544 1236732.42094018)</td>\n",
       "      <td>7.641919e+06</td>\n",
       "      <td>1.236661e+06</td>\n",
       "      <td>7.641941e+06</td>\n",
       "      <td>1.236732e+06</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    id_trip mode           purpose           starttime             endtime  \\\n",
       "3    150744  car  pick_up_drop_off 2017-09-18 10:02:50 2017-09-18 10:17:12   \n",
       "21    35763  car             shops 2017-09-18 11:32:54 2017-09-18 12:04:07   \n",
       "\n",
       "                                             geometry  \\\n",
       "3   LINESTRING (7624322.265039734 1247672.97005955...   \n",
       "21  LINESTRING (7641918.591122853 1236660.83022969...   \n",
       "\n",
       "                                      start_can  \\\n",
       "3   POINT (7624322.265039734 1247672.970059557)   \n",
       "21  POINT (7641918.591122853 1236660.830229698)   \n",
       "\n",
       "                                        end_can        startx        starty  \\\n",
       "3   POINT (7631863.767736511 1250414.940902894)  7.624322e+06  1.247673e+06   \n",
       "21   POINT (7641940.751710544 1236732.42094018)  7.641919e+06  1.236661e+06   \n",
       "\n",
       "            endx          endy        precip       temp  \n",
       "3   7.631864e+06  1.250415e+06  0.000000e+00  16.910884  \n",
       "21  7.641941e+06  1.236732e+06  9.972328e-07  18.007062  "
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2017.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 3. Calculate distance and duration"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "calculating distance\n",
      "calculating distance\n"
     ]
    }
   ],
   "source": [
    "if 'distance_m' not in gdf_2016.columns:\n",
    "    print(\"calculating distance\")\n",
    "    gdf_2016['distance_m'] = gdf_2016['geometry'].apply(lambda row: row.length)\n",
    "else:\n",
    "    print('distance already calculated')\n",
    "    \n",
    "\n",
    "if 'distance_m' not in gdf_2017.columns:\n",
    "    print(\"calculating distance\")\n",
    "    gdf_2017['distance_m'] = gdf_2017['geometry'].apply(lambda row: row.length)\n",
    "else:\n",
    "    print('distance already calculated')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "duration already calculated\n"
     ]
    }
   ],
   "source": [
    "if 'duration' not in gdf_2016.columns:\n",
    "    gdf_2016['duration'] = pd.to_datetime(gdf_2016['endtime']) - pd.to_datetime(gdf_2016['starttime'])\n",
    "    gdf_2016['duration'] = gdf_2016['duration'].apply(lambda tm: tm.seconds)\n",
    "else:\n",
    "    print('duration already calculated')\n",
    "    \n",
    "if 'duration' not in gdf_2017.columns:\n",
    "    gdf_2017['duration'] = pd.to_datetime(gdf_2017['endtime']) - pd.to_datetime(gdf_2017['starttime'])\n",
    "    gdf_2017['duration'] = gdf_2017['duration'].apply(lambda tm: tm.seconds)\n",
    "else:\n",
    "    print('duration already calculated')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "metadata": {},
   "outputs": [],
   "source": [
    "# %%time\n",
    "# gdf_2016 = preprocessing.create_metrics.calc_direction(gdf_2016)\n",
    "# gdf_2017 = preprocessing.create_metrics.calc_direction(gdf_2017)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3.1 Remove distance and duration outliers\n",
    "50 m >= Distance <= 100 km  \n",
    "60 sec >= Duration <= 180 mins "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25882\n",
      "23499\n"
     ]
    }
   ],
   "source": [
    "print(len(gdf_2016)) ## 25882\n",
    "print(len(gdf_2017)) ## 23499"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "metadata": {},
   "outputs": [],
   "source": [
    "# outlier removal\n",
    "gdf_2016 = gdf_2016.loc[gdf_2016.distance_m >= 50]\n",
    "gdf_2016 = gdf_2016.loc[gdf_2016.duration >= 60]\n",
    "gdf_2016 = gdf_2016.loc[gdf_2016.distance_m <= 100000]\n",
    "gdf_2016 = gdf_2016.loc[gdf_2016.duration <= 10800]\n",
    "gdf_2016 = gdf_2016.dropna(subset=['mode','precip'])\n",
    "gdf_2016 = gdf_2016.reset_index(drop=True)\n",
    "\n",
    "gdf_2017 = gdf_2017.loc[gdf_2017.distance_m >= 50]\n",
    "gdf_2017 = gdf_2017.loc[gdf_2017.duration >= 60]\n",
    "gdf_2017 = gdf_2017.loc[gdf_2017.distance_m <= 100000]\n",
    "gdf_2017 = gdf_2017.loc[gdf_2017.duration <= 10800]\n",
    "gdf_2017 = gdf_2017.dropna(subset=['mode','precip'])\n",
    "gdf_2017 = gdf_2017.reset_index(drop=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "25805\n",
      "22948\n"
     ]
    }
   ],
   "source": [
    "print(len(gdf_2016)) ## 25805\n",
    "print(len(gdf_2017)) ## 22948"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016.reset_index(drop=True, inplace=True)\n",
    "gdf_2017.reset_index(drop=True, inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1889461</td>\n",
       "      <td>15.4</td>\n",
       "      <td>447</td>\n",
       "      <td>public_transport</td>\n",
       "      <td>leisure</td>\n",
       "      <td>36</td>\n",
       "      <td>[{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 19:46:14</td>\n",
       "      <td>2016-09-08 19:53:41</td>\n",
       "      <td>LINESTRING (7632055.840015979 1247584.15415876...</td>\n",
       "      <td>POINT (7632055.840015979 1247584.154158766)</td>\n",
       "      <td>POINT (7630297.958008133 1248128.900960702)</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>1.247584e+06</td>\n",
       "      <td>7.630298e+06</td>\n",
       "      <td>1.248129e+06</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "      <td>1843.264582</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2071991</td>\n",
       "      <td>12.4</td>\n",
       "      <td>844</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>56</td>\n",
       "      <td>[{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 18:22:22</td>\n",
       "      <td>2016-09-09 18:36:26</td>\n",
       "      <td>LINESTRING (7628002.075274516 1247761.31724215...</td>\n",
       "      <td>POINT (7628002.075274516 1247761.317242159)</td>\n",
       "      <td>POINT (7626229.644805724 1247149.931923385)</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>1.247761e+06</td>\n",
       "      <td>7.626230e+06</td>\n",
       "      <td>1.247150e+06</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "      <td>2761.792383</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1667922</td>\n",
       "      <td>4.2</td>\n",
       "      <td>1211</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>29</td>\n",
       "      <td>[{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 23:41:59</td>\n",
       "      <td>2016-09-10 00:02:10</td>\n",
       "      <td>LINESTRING (7628517.528697006 1246292.61362129...</td>\n",
       "      <td>POINT (7628517.528697006 1246292.613621292)</td>\n",
       "      <td>POINT (7629431.778009223 1246198.082987975)</td>\n",
       "      <td>7.628518e+06</td>\n",
       "      <td>1.246293e+06</td>\n",
       "      <td>7.629432e+06</td>\n",
       "      <td>1.246198e+06</td>\n",
       "      <td>0.001429</td>\n",
       "      <td>21.769356</td>\n",
       "      <td>1068.301088</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  avg_speed  duration              mode     purpose  n_coord  \\\n",
       "0  1889461       15.4       447  public_transport     leisure       36   \n",
       "1  2071991       12.4       844           cycling  food_drink       56   \n",
       "2  1667922        4.2      1211           cycling  food_drink       29   \n",
       "\n",
       "                                            segments           starttime  \\\n",
       "0  [{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-08 19:46:14   \n",
       "1  [{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 18:22:22   \n",
       "2  [{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 23:41:59   \n",
       "\n",
       "              endtime                                           geometry  \\\n",
       "0 2016-09-08 19:53:41  LINESTRING (7632055.840015979 1247584.15415876...   \n",
       "1 2016-09-09 18:36:26  LINESTRING (7628002.075274516 1247761.31724215...   \n",
       "2 2016-09-10 00:02:10  LINESTRING (7628517.528697006 1246292.61362129...   \n",
       "\n",
       "                                     start_can  \\\n",
       "0  POINT (7632055.840015979 1247584.154158766)   \n",
       "1  POINT (7628002.075274516 1247761.317242159)   \n",
       "2  POINT (7628517.528697006 1246292.613621292)   \n",
       "\n",
       "                                       end_can        startx        starty  \\\n",
       "0  POINT (7630297.958008133 1248128.900960702)  7.632056e+06  1.247584e+06   \n",
       "1  POINT (7626229.644805724 1247149.931923385)  7.628002e+06  1.247761e+06   \n",
       "2  POINT (7629431.778009223 1246198.082987975)  7.628518e+06  1.246293e+06   \n",
       "\n",
       "           endx          endy    precip       temp   distance_m  \n",
       "0  7.630298e+06  1.248129e+06  0.000134  25.844886  1843.264582  \n",
       "1  7.626230e+06  1.247150e+06  0.001427  24.930720  2761.792383  \n",
       "2  7.629432e+06  1.246198e+06  0.001429  21.769356  1068.301088  "
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.head(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>duration</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>150744</td>\n",
       "      <td>car</td>\n",
       "      <td>pick_up_drop_off</td>\n",
       "      <td>2017-09-18 10:02:50</td>\n",
       "      <td>2017-09-18 10:17:12</td>\n",
       "      <td>LINESTRING (7624322.265039734 1247672.97005955...</td>\n",
       "      <td>POINT (7624322.265039734 1247672.970059557)</td>\n",
       "      <td>POINT (7631863.767736511 1250414.940902894)</td>\n",
       "      <td>7.624322e+06</td>\n",
       "      <td>1.247673e+06</td>\n",
       "      <td>7.631864e+06</td>\n",
       "      <td>1.250415e+06</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>16.910884</td>\n",
       "      <td>9935.922336</td>\n",
       "      <td>862</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35763</td>\n",
       "      <td>car</td>\n",
       "      <td>shops</td>\n",
       "      <td>2017-09-18 11:32:54</td>\n",
       "      <td>2017-09-18 12:04:07</td>\n",
       "      <td>LINESTRING (7641918.591122853 1236660.83022969...</td>\n",
       "      <td>POINT (7641918.591122853 1236660.830229698)</td>\n",
       "      <td>POINT (7641940.751710544 1236732.42094018)</td>\n",
       "      <td>7.641919e+06</td>\n",
       "      <td>1.236661e+06</td>\n",
       "      <td>7.641941e+06</td>\n",
       "      <td>1.236732e+06</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>6832.113937</td>\n",
       "      <td>1873</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>323826</td>\n",
       "      <td>car</td>\n",
       "      <td>health</td>\n",
       "      <td>2017-09-18 12:25:08</td>\n",
       "      <td>2017-09-18 12:44:33</td>\n",
       "      <td>LINESTRING (7625699.094351658 1248426.57008442...</td>\n",
       "      <td>POINT (7625699.094351658 1248426.57008442)</td>\n",
       "      <td>POINT (7616671.176450541 1252917.246846175)</td>\n",
       "      <td>7.625699e+06</td>\n",
       "      <td>1.248427e+06</td>\n",
       "      <td>7.616671e+06</td>\n",
       "      <td>1.252917e+06</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>12233.968564</td>\n",
       "      <td>1165</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip mode           purpose           starttime             endtime  \\\n",
       "0   150744  car  pick_up_drop_off 2017-09-18 10:02:50 2017-09-18 10:17:12   \n",
       "1    35763  car             shops 2017-09-18 11:32:54 2017-09-18 12:04:07   \n",
       "2   323826  car            health 2017-09-18 12:25:08 2017-09-18 12:44:33   \n",
       "\n",
       "                                            geometry  \\\n",
       "0  LINESTRING (7624322.265039734 1247672.97005955...   \n",
       "1  LINESTRING (7641918.591122853 1236660.83022969...   \n",
       "2  LINESTRING (7625699.094351658 1248426.57008442...   \n",
       "\n",
       "                                     start_can  \\\n",
       "0  POINT (7624322.265039734 1247672.970059557)   \n",
       "1  POINT (7641918.591122853 1236660.830229698)   \n",
       "2   POINT (7625699.094351658 1248426.57008442)   \n",
       "\n",
       "                                       end_can        startx        starty  \\\n",
       "0  POINT (7631863.767736511 1250414.940902894)  7.624322e+06  1.247673e+06   \n",
       "1   POINT (7641940.751710544 1236732.42094018)  7.641919e+06  1.236661e+06   \n",
       "2  POINT (7616671.176450541 1252917.246846175)  7.625699e+06  1.248427e+06   \n",
       "\n",
       "           endx          endy        precip       temp    distance_m  duration  \n",
       "0  7.631864e+06  1.250415e+06  0.000000e+00  16.910884   9935.922336       862  \n",
       "1  7.641941e+06  1.236732e+06  9.972328e-07  18.007062   6832.113937      1873  \n",
       "2  7.616671e+06  1.252917e+06  9.972328e-07  18.007062  12233.968564      1165  "
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2017.head(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 4. Add time-interval labels"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4.1 Time-interval labels\n",
    "(morning: 0600-1059, midday: 1100-1359, afternoon: 1400-1659, evening: 1700-2159, midnight: 2200-0559)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "converting start and end timestamps to datetime objects\n"
     ]
    }
   ],
   "source": [
    "if not type(gdf_2016.starttime[0]) == datetime.datetime or not type(gdf_2017.starttime[0]) == datetime.datetime:\n",
    "    print(\"converting start and end timestamps to datetime objects\")\n",
    "    gdf_2016['starttime'] = pd.to_datetime(gdf_2016['starttime'])\n",
    "    gdf_2016['endtime'] = pd.to_datetime(gdf_2016['endtime'])\n",
    "    gdf_2017['starttime'] = pd.to_datetime(gdf_2017['starttime'])\n",
    "    gdf_2017['endtime'] = pd.to_datetime(gdf_2017['endtime'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016['weekday'] = gdf_2016.starttime.apply(lambda dt: dt.dayofweek < 5)\n",
    "gdf_2017['weekday'] = gdf_2017.starttime.apply(lambda dt: dt.dayofweek < 5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True     17802\n",
      "False     8003\n",
      "Name: weekday, dtype: int64\n",
      "True     14960\n",
      "False     7988\n",
      "Name: weekday, dtype: int64\n"
     ]
    }
   ],
   "source": [
    "print(gdf_2016.weekday.value_counts())\n",
    "print(gdf_2017.weekday.value_counts())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "metadata": {},
   "outputs": [],
   "source": [
    "# interval times after: Ermagun, A., Fan, Y., Wolfson, J., Adomavicius, G., and Das, K., 2017. Real-time trip purpose prediction using online location-based search and discovery services. Transportation Research Part C: Emerging Technologies\n",
    "interval_times = {'morning':  {'min':6,\n",
    "                               'max':11},\n",
    "                  'midday':   {'min':11,\n",
    "                               'max':14},\n",
    "                  'afternoon':{'min':14,\n",
    "                               'max':17},\n",
    "                  'evening':  {'min':17,\n",
    "                               'max':22},\n",
    "                  'midnight': {'min':22,\n",
    "                               'max':6}\n",
    "                 }\n",
    "\n",
    "def trip_end_time_interval(row):\n",
    "    \"\"\"\n",
    "    function to find out which time interval the trip ends in\n",
    "    \"\"\"\n",
    "    time_interval_booleans = [False, False, False, False, False]\n",
    "    for ind, key in enumerate(interval_times.keys()):\n",
    "        if key == 'midnight':\n",
    "            if row.endtime.hour >= interval_times[key]['min'] or row.endtime.hour < interval_times[key]['max']:\n",
    "                time_interval_booleans[ind] = True\n",
    "        if row.endtime.hour >= interval_times[key]['min'] and row.endtime.hour < interval_times[key]['max']:\n",
    "            time_interval_booleans[ind] = True\n",
    "            \n",
    "    return time_interval_booleans\n",
    "    "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016['all_timeintv'] = gdf_2016.apply(trip_end_time_interval, axis=1)\n",
    "gdf_2017['all_timeintv'] = gdf_2017.apply(trip_end_time_interval, axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    [False, False, False, True, False]\n",
       "1    [False, False, False, True, False]\n",
       "2    [False, False, False, False, True]\n",
       "3    [True, False, False, False, False]\n",
       "4    [False, True, False, False, False]\n",
       "Name: all_timeintv, dtype: object"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016['all_timeintv'].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_timeintv_16 = gdf_2016['all_timeintv'].apply(pd.Series)\n",
    "gdf_timeintv_17 = gdf_2017['all_timeintv'].apply(pd.Series)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_timeintv_16.columns = ['morning','midday', 'afternoon',\\\n",
    "                           'evening', 'midnight']\n",
    "gdf_timeintv_17.columns = ['morning','midday', 'afternoon',\\\n",
    "                           'evening', 'midnight']\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   morning  midday  afternoon  evening  midnight\n",
       "0     True   False      False    False     False\n",
       "1    False    True      False    False     False\n",
       "2    False    True      False    False     False\n",
       "3    False    True      False    False     False\n",
       "4    False   False       True    False     False"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_timeintv_17.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "concatenating\n"
     ]
    }
   ],
   "source": [
    "if not 'b_arrival_evening' in gdf_2016.columns:\n",
    "    print('concatenating')\n",
    "    gdf_2016 = pd.concat([gdf_2016, gdf_timeintv_16], axis=1)\n",
    "    gdf_2017 = pd.concat([gdf_2017, gdf_timeintv_17], axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016 = gdf_2016.drop('all_timeintv',axis=1)\n",
    "gdf_2017 = gdf_2017.drop('all_timeintv',axis=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>...</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>weekday</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1889461</td>\n",
       "      <td>15.4</td>\n",
       "      <td>447</td>\n",
       "      <td>public_transport</td>\n",
       "      <td>leisure</td>\n",
       "      <td>36</td>\n",
       "      <td>[{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 19:46:14</td>\n",
       "      <td>2016-09-08 19:53:41</td>\n",
       "      <td>LINESTRING (7632055.840015979 1247584.15415876...</td>\n",
       "      <td>...</td>\n",
       "      <td>1.248129e+06</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "      <td>1843.264582</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2071991</td>\n",
       "      <td>12.4</td>\n",
       "      <td>844</td>\n",
       "      <td>cycling</td>\n",
       "      <td>food_drink</td>\n",
       "      <td>56</td>\n",
       "      <td>[{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 18:22:22</td>\n",
       "      <td>2016-09-09 18:36:26</td>\n",
       "      <td>LINESTRING (7628002.075274516 1247761.31724215...</td>\n",
       "      <td>...</td>\n",
       "      <td>1.247150e+06</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "      <td>2761.792383</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 25 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  avg_speed  duration              mode     purpose  n_coord  \\\n",
       "0  1889461       15.4       447  public_transport     leisure       36   \n",
       "1  2071991       12.4       844           cycling  food_drink       56   \n",
       "\n",
       "                                            segments           starttime  \\\n",
       "0  [{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-08 19:46:14   \n",
       "1  [{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i... 2016-09-09 18:22:22   \n",
       "\n",
       "              endtime                                           geometry  ...  \\\n",
       "0 2016-09-08 19:53:41  LINESTRING (7632055.840015979 1247584.15415876...  ...   \n",
       "1 2016-09-09 18:36:26  LINESTRING (7628002.075274516 1247761.31724215...  ...   \n",
       "\n",
       "           endy    precip       temp   distance_m  weekday  morning  midday  \\\n",
       "0  1.248129e+06  0.000134  25.844886  1843.264582     True    False   False   \n",
       "1  1.247150e+06  0.001427  24.930720  2761.792383     True    False   False   \n",
       "\n",
       "   afternoon  evening  midnight  \n",
       "0      False     True     False  \n",
       "1      False     True     False  \n",
       "\n",
       "[2 rows x 25 columns]"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.head(2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>geometry</th>\n",
       "      <th>start_can</th>\n",
       "      <th>end_can</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>...</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>duration</th>\n",
       "      <th>weekday</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>150744</td>\n",
       "      <td>car</td>\n",
       "      <td>pick_up_drop_off</td>\n",
       "      <td>2017-09-18 10:02:50</td>\n",
       "      <td>2017-09-18 10:17:12</td>\n",
       "      <td>LINESTRING (7624322.265039734 1247672.97005955...</td>\n",
       "      <td>POINT (7624322.265039734 1247672.970059557)</td>\n",
       "      <td>POINT (7631863.767736511 1250414.940902894)</td>\n",
       "      <td>7.624322e+06</td>\n",
       "      <td>1.247673e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>16.910884</td>\n",
       "      <td>9935.922336</td>\n",
       "      <td>862</td>\n",
       "      <td>True</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35763</td>\n",
       "      <td>car</td>\n",
       "      <td>shops</td>\n",
       "      <td>2017-09-18 11:32:54</td>\n",
       "      <td>2017-09-18 12:04:07</td>\n",
       "      <td>LINESTRING (7641918.591122853 1236660.83022969...</td>\n",
       "      <td>POINT (7641918.591122853 1236660.830229698)</td>\n",
       "      <td>POINT (7641940.751710544 1236732.42094018)</td>\n",
       "      <td>7.641919e+06</td>\n",
       "      <td>1.236661e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>6832.113937</td>\n",
       "      <td>1873</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2 rows × 22 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip mode           purpose           starttime             endtime  \\\n",
       "0   150744  car  pick_up_drop_off 2017-09-18 10:02:50 2017-09-18 10:17:12   \n",
       "1    35763  car             shops 2017-09-18 11:32:54 2017-09-18 12:04:07   \n",
       "\n",
       "                                            geometry  \\\n",
       "0  LINESTRING (7624322.265039734 1247672.97005955...   \n",
       "1  LINESTRING (7641918.591122853 1236660.83022969...   \n",
       "\n",
       "                                     start_can  \\\n",
       "0  POINT (7624322.265039734 1247672.970059557)   \n",
       "1  POINT (7641918.591122853 1236660.830229698)   \n",
       "\n",
       "                                       end_can        startx        starty  \\\n",
       "0  POINT (7631863.767736511 1250414.940902894)  7.624322e+06  1.247673e+06   \n",
       "1   POINT (7641940.751710544 1236732.42094018)  7.641919e+06  1.236661e+06   \n",
       "\n",
       "   ...        precip       temp   distance_m  duration  weekday  morning  \\\n",
       "0  ...  0.000000e+00  16.910884  9935.922336       862     True     True   \n",
       "1  ...  9.972328e-07  18.007062  6832.113937      1873     True    False   \n",
       "\n",
       "   midday  afternoon  evening  midnight  \n",
       "0   False      False    False     False  \n",
       "1    True      False    False     False  \n",
       "\n",
       "[2 rows x 22 columns]"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2017.head(2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 5. Create model inputs"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index(['id_trip', 'avg_speed', 'duration', 'mode', 'purpose', 'n_coord',\n",
       "       'segments', 'starttime', 'endtime', 'geometry', 'start_can', 'end_can',\n",
       "       'startx', 'starty', 'endx', 'endy', 'precip', 'temp', 'distance_m',\n",
       "       'weekday', 'morning', 'midday', 'afternoon', 'evening', 'midnight'],\n",
       "      dtype='object')"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "applying new codes\n"
     ]
    }
   ],
   "source": [
    "# create common factors across the datasets (these need to be copied)\n",
    "purpose_codes = {'leisure': 0, 'food_drink': 1, 'shops': 2, 'pick_up_drop_off': 3, 'education': 4, 'health': 5}\n",
    "mode_codes = {'walking': 0, 'public_transport': 1, 'car': 2, 'cycling': 3, 'public_transport, car': 4, 'other': 5}\n",
    "\n",
    "# to stop user switching back\n",
    "if not gdf_2016['mode'].values[0] == 1:\n",
    "    print('applying new codes')\n",
    "    gdf_2016['purpose'] = gdf_2016['purpose'].apply(lambda row: purpose_codes[row])\n",
    "    gdf_2016['mode'] = gdf_2016['mode'].apply(lambda row: mode_codes[row])\n",
    "    \n",
    "    gdf_2017['purpose'] = gdf_2017['purpose'].apply(lambda row: purpose_codes[row])\n",
    "    gdf_2017['mode'] = gdf_2017['mode'].apply(lambda row: mode_codes[row])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [],
   "source": [
    "class ModelInputs:\n",
    "    def __init__(self, data):\n",
    "        self.data = data.copy()\n",
    "    \n",
    "    def model_setup(self, norm=False, oversample=False):\n",
    "        self.X = self.data[['id_trip',\"mode\",\"duration\",\"distance_m\",\"weekday\", \"precip\",\"temp\",\\\n",
    "                            \"morning\",\"midday\",\"afternoon\",\"evening\",\"midnight\",'startx','starty',\\\n",
    "                           'endx','endy']]\n",
    "        self.y = self.data[[\"purpose\"]] # purpose_labels\n",
    "        self.X.weekday = self.X.weekday.astype(int)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016_data_inputs = ModelInputs(gdf_2016)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Applications/anaconda/envs/st-ds/lib/python3.7/site-packages/pandas/core/generic.py:5209: SettingWithCopyWarning: \n",
      "A value is trying to be set on a copy of a slice from a DataFrame.\n",
      "Try using .loc[row_indexer,col_indexer] = value instead\n",
      "\n",
      "See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n",
      "  self[name] = value\n"
     ]
    }
   ],
   "source": [
    "gdf_2016_data_inputs.model_setup()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>duration</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>weekday</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1889461</td>\n",
       "      <td>1</td>\n",
       "      <td>447</td>\n",
       "      <td>1843.264582</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>1.247584e+06</td>\n",
       "      <td>7.630298e+06</td>\n",
       "      <td>1.248129e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2071991</td>\n",
       "      <td>3</td>\n",
       "      <td>844</td>\n",
       "      <td>2761.792383</td>\n",
       "      <td>1</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>1.247761e+06</td>\n",
       "      <td>7.626230e+06</td>\n",
       "      <td>1.247150e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1667922</td>\n",
       "      <td>3</td>\n",
       "      <td>1211</td>\n",
       "      <td>1068.301088</td>\n",
       "      <td>1</td>\n",
       "      <td>0.001429</td>\n",
       "      <td>21.769356</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>7.628518e+06</td>\n",
       "      <td>1.246293e+06</td>\n",
       "      <td>7.629432e+06</td>\n",
       "      <td>1.246198e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2072003</td>\n",
       "      <td>0</td>\n",
       "      <td>1266</td>\n",
       "      <td>1394.114250</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>16.639258</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.628223e+06</td>\n",
       "      <td>1.247461e+06</td>\n",
       "      <td>7.628197e+06</td>\n",
       "      <td>1.246306e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2072007</td>\n",
       "      <td>0</td>\n",
       "      <td>603</td>\n",
       "      <td>552.535139</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>21.759996</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.629631e+06</td>\n",
       "      <td>1.245856e+06</td>\n",
       "      <td>7.630013e+06</td>\n",
       "      <td>1.245629e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  mode  duration   distance_m  weekday    precip       temp  \\\n",
       "0  1889461     1       447  1843.264582        1  0.000134  25.844886   \n",
       "1  2071991     3       844  2761.792383        1  0.001427  24.930720   \n",
       "2  1667922     3      1211  1068.301088        1  0.001429  21.769356   \n",
       "3  2072003     0      1266  1394.114250        0  0.000000  16.639258   \n",
       "4  2072007     0       603   552.535139        0  0.000000  21.759996   \n",
       "\n",
       "   morning  midday  afternoon  evening  midnight        startx        starty  \\\n",
       "0    False   False      False     True     False  7.632056e+06  1.247584e+06   \n",
       "1    False   False      False     True     False  7.628002e+06  1.247761e+06   \n",
       "2    False   False      False    False      True  7.628518e+06  1.246293e+06   \n",
       "3     True   False      False    False     False  7.628223e+06  1.247461e+06   \n",
       "4    False    True      False    False     False  7.629631e+06  1.245856e+06   \n",
       "\n",
       "           endx          endy  \n",
       "0  7.630298e+06  1.248129e+06  \n",
       "1  7.626230e+06  1.247150e+06  \n",
       "2  7.629432e+06  1.246198e+06  \n",
       "3  7.628197e+06  1.246306e+06  \n",
       "4  7.630013e+06  1.245629e+06  "
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gdf_2016_data_inputs.X.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.1 save final preprocessed data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "## save X & y data\n",
    "for nm, df in zip(['gdf_2016', 'gdf_2017'], [gdf_2016, gdf_2017]):\n",
    "    data_inputs = ModelInputs(df)\n",
    "    with open('../../Data/model_inputs/{0}_mode_factors.txt'.format(nm), 'w') as my_file:\n",
    "        my_file.write(str(mode_codes))\n",
    "        my_file.close()\n",
    "\n",
    "    with open('../../Data/model_inputs/{0}_purpose_factors.txt'.format(nm), 'w') as my_file:\n",
    "        my_file.write(str(purpose_codes))\n",
    "        my_file.close()\n",
    "    \n",
    "    data_inputs.model_setup()\n",
    "    data_inputs.X.to_csv('../../Data/model_inputs/{0}_X.csv'.format(nm), index=False)\n",
    "    data_inputs.y.to_csv('../../Data/model_inputs/{0}_y.csv'.format(nm), index=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5.2 save final geoDataFrame"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016.drop(['start_can','end_can'],axis=1,inplace=True)\n",
    "gdf_2017.drop(['start_can','end_can'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "gdf_2016['starttime'] = gdf_2016['starttime'].astype(str)\n",
    "gdf_2016['endtime'] = gdf_2016['endtime'].astype(str)\n",
    "gdf_2017['starttime'] = gdf_2017['starttime'].astype(str)\n",
    "gdf_2017['endtime'] = gdf_2017['endtime'].astype(str)\n",
    "\n",
    "# path to the preprocessed MTL Trajet data \n",
    "path_final_2016 = \"../../Data/mtl_trajet/mtl_trajet_2016_final.shp\"\n",
    "path_final_2017 = \"../../Data/mtl_trajet/mtl_trajet_2017_final.shp\"\n",
    "\n",
    "gdf_2016.to_file(path_final_2016, encoding='utf-8')\n",
    "gdf_2017.to_file(path_final_2017, encoding='utf-8')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## X. load data back in and other checks"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>duration</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>weekday</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1889461</td>\n",
       "      <td>1</td>\n",
       "      <td>447</td>\n",
       "      <td>1843.264582</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>1.247584e+06</td>\n",
       "      <td>7.630298e+06</td>\n",
       "      <td>1.248129e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2071991</td>\n",
       "      <td>3</td>\n",
       "      <td>844</td>\n",
       "      <td>2761.792383</td>\n",
       "      <td>1</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>1.247761e+06</td>\n",
       "      <td>7.626230e+06</td>\n",
       "      <td>1.247150e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1667922</td>\n",
       "      <td>3</td>\n",
       "      <td>1211</td>\n",
       "      <td>1068.301088</td>\n",
       "      <td>1</td>\n",
       "      <td>0.001429</td>\n",
       "      <td>21.769356</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>7.628518e+06</td>\n",
       "      <td>1.246293e+06</td>\n",
       "      <td>7.629432e+06</td>\n",
       "      <td>1.246198e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2072003</td>\n",
       "      <td>0</td>\n",
       "      <td>1266</td>\n",
       "      <td>1394.114250</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>16.639258</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.628223e+06</td>\n",
       "      <td>1.247461e+06</td>\n",
       "      <td>7.628197e+06</td>\n",
       "      <td>1.246306e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2072007</td>\n",
       "      <td>0</td>\n",
       "      <td>603</td>\n",
       "      <td>552.535139</td>\n",
       "      <td>0</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>21.759996</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.629631e+06</td>\n",
       "      <td>1.245856e+06</td>\n",
       "      <td>7.630013e+06</td>\n",
       "      <td>1.245629e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  mode  duration   distance_m  weekday    precip       temp  \\\n",
       "0  1889461     1       447  1843.264582        1  0.000134  25.844886   \n",
       "1  2071991     3       844  2761.792383        1  0.001427  24.930720   \n",
       "2  1667922     3      1211  1068.301088        1  0.001429  21.769356   \n",
       "3  2072003     0      1266  1394.114250        0  0.000000  16.639258   \n",
       "4  2072007     0       603   552.535139        0  0.000000  21.759996   \n",
       "\n",
       "   morning  midday  afternoon  evening  midnight        startx        starty  \\\n",
       "0    False   False      False     True     False  7.632056e+06  1.247584e+06   \n",
       "1    False   False      False     True     False  7.628002e+06  1.247761e+06   \n",
       "2    False   False      False    False      True  7.628518e+06  1.246293e+06   \n",
       "3     True   False      False    False     False  7.628223e+06  1.247461e+06   \n",
       "4    False    True      False    False     False  7.629631e+06  1.245856e+06   \n",
       "\n",
       "           endx          endy  \n",
       "0  7.630298e+06  1.248129e+06  \n",
       "1  7.626230e+06  1.247150e+06  \n",
       "2  7.629432e+06  1.246198e+06  \n",
       "3  7.628197e+06  1.246306e+06  \n",
       "4  7.630013e+06  1.245629e+06  "
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.read_csv('../../Data/model_inputs/gdf_2016_X.csv').head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>purpose</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   purpose\n",
       "0        0\n",
       "1        1\n",
       "2        1\n",
       "3        1\n",
       "4        0"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.read_csv('../../Data/model_inputs/gdf_2016_y.csv').head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>duration</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>weekday</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>150744</td>\n",
       "      <td>2</td>\n",
       "      <td>862</td>\n",
       "      <td>9935.922336</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>16.910884</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.624322e+06</td>\n",
       "      <td>1.247673e+06</td>\n",
       "      <td>7.631864e+06</td>\n",
       "      <td>1.250415e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35763</td>\n",
       "      <td>2</td>\n",
       "      <td>1873</td>\n",
       "      <td>6832.113937</td>\n",
       "      <td>1</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.641919e+06</td>\n",
       "      <td>1.236661e+06</td>\n",
       "      <td>7.641941e+06</td>\n",
       "      <td>1.236732e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>323826</td>\n",
       "      <td>2</td>\n",
       "      <td>1165</td>\n",
       "      <td>12233.968564</td>\n",
       "      <td>1</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.625699e+06</td>\n",
       "      <td>1.248427e+06</td>\n",
       "      <td>7.616671e+06</td>\n",
       "      <td>1.252917e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>375668</td>\n",
       "      <td>2</td>\n",
       "      <td>820</td>\n",
       "      <td>3612.405991</td>\n",
       "      <td>1</td>\n",
       "      <td>1.495849e-06</td>\n",
       "      <td>20.940647</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.630948e+06</td>\n",
       "      <td>1.253394e+06</td>\n",
       "      <td>7.630941e+06</td>\n",
       "      <td>1.253445e+06</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>212877</td>\n",
       "      <td>2</td>\n",
       "      <td>1316</td>\n",
       "      <td>26428.385191</td>\n",
       "      <td>1</td>\n",
       "      <td>1.495849e-06</td>\n",
       "      <td>23.092603</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>True</td>\n",
       "      <td>False</td>\n",
       "      <td>False</td>\n",
       "      <td>7.631318e+06</td>\n",
       "      <td>1.252962e+06</td>\n",
       "      <td>7.646416e+06</td>\n",
       "      <td>1.264378e+06</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  mode  duration    distance_m  weekday        precip       temp  \\\n",
       "0   150744     2       862   9935.922336        1  0.000000e+00  16.910884   \n",
       "1    35763     2      1873   6832.113937        1  9.972328e-07  18.007062   \n",
       "2   323826     2      1165  12233.968564        1  9.972328e-07  18.007062   \n",
       "3   375668     2       820   3612.405991        1  1.495849e-06  20.940647   \n",
       "4   212877     2      1316  26428.385191        1  1.495849e-06  23.092603   \n",
       "\n",
       "   morning  midday  afternoon  evening  midnight        startx        starty  \\\n",
       "0     True   False      False    False     False  7.624322e+06  1.247673e+06   \n",
       "1    False    True      False    False     False  7.641919e+06  1.236661e+06   \n",
       "2    False    True      False    False     False  7.625699e+06  1.248427e+06   \n",
       "3    False    True      False    False     False  7.630948e+06  1.253394e+06   \n",
       "4    False   False       True    False     False  7.631318e+06  1.252962e+06   \n",
       "\n",
       "           endx          endy  \n",
       "0  7.631864e+06  1.250415e+06  \n",
       "1  7.641941e+06  1.236732e+06  \n",
       "2  7.616671e+06  1.252917e+06  \n",
       "3  7.630941e+06  1.253445e+06  \n",
       "4  7.646416e+06  1.264378e+06  "
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.read_csv('../../Data/model_inputs/gdf_2017_X.csv').head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>purpose</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   purpose\n",
       "0        3\n",
       "1        2\n",
       "2        5\n",
       "3        0\n",
       "4        0"
      ]
     },
     "execution_count": 79,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.read_csv('../../Data/model_inputs/gdf_2017_y.csv').head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>avg_speed</th>\n",
       "      <th>duration</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>n_coord</th>\n",
       "      <th>segments</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>startx</th>\n",
       "      <th>...</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>weekday</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "      <th>geometry</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1889461</td>\n",
       "      <td>15.4</td>\n",
       "      <td>447</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>36</td>\n",
       "      <td>[{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-08 19:46:14</td>\n",
       "      <td>2016-09-08 19:53:41</td>\n",
       "      <td>7.632056e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000134</td>\n",
       "      <td>25.844886</td>\n",
       "      <td>1843.264582</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7632055.840015979 1247584.15415876...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2071991</td>\n",
       "      <td>12.4</td>\n",
       "      <td>844</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>56</td>\n",
       "      <td>[{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 18:22:22</td>\n",
       "      <td>2016-09-09 18:36:26</td>\n",
       "      <td>7.628002e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.001427</td>\n",
       "      <td>24.930720</td>\n",
       "      <td>2761.792383</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7628002.075274516 1247761.31724215...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1667922</td>\n",
       "      <td>4.2</td>\n",
       "      <td>1211</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>29</td>\n",
       "      <td>[{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-09 23:41:59</td>\n",
       "      <td>2016-09-10 00:02:10</td>\n",
       "      <td>7.628518e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.001429</td>\n",
       "      <td>21.769356</td>\n",
       "      <td>1068.301088</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>LINESTRING (7628517.528697006 1246292.61362129...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2072003</td>\n",
       "      <td>4.8</td>\n",
       "      <td>1266</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>34</td>\n",
       "      <td>[{\"id\": 5640, \"source\": \"reseau_cyclable\"}, {\"...</td>\n",
       "      <td>2016-09-10 10:29:44</td>\n",
       "      <td>2016-09-10 10:50:50</td>\n",
       "      <td>7.628223e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>16.639258</td>\n",
       "      <td>1394.114250</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7628222.927915867 1247461.40768243...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2072007</td>\n",
       "      <td>4.5</td>\n",
       "      <td>603</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>16</td>\n",
       "      <td>[{\"id\": 1240255, \"source\": \"geobase_mtl\"}, {\"i...</td>\n",
       "      <td>2016-09-10 13:06:26</td>\n",
       "      <td>2016-09-10 13:16:29</td>\n",
       "      <td>7.629631e+06</td>\n",
       "      <td>...</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>21.759996</td>\n",
       "      <td>552.535139</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7629631.088157224 1245856.46655086...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 23 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  avg_speed  duration  mode  purpose  n_coord  \\\n",
       "0  1889461       15.4       447     1        0       36   \n",
       "1  2071991       12.4       844     3        1       56   \n",
       "2  1667922        4.2      1211     3        1       29   \n",
       "3  2072003        4.8      1266     0        1       34   \n",
       "4  2072007        4.5       603     0        0       16   \n",
       "\n",
       "                                            segments            starttime  \\\n",
       "0  [{\"id\": 1390715, \"source\": \"geobase_mtl\"}, {\"i...  2016-09-08 19:46:14   \n",
       "1  [{\"id\": 1150004, \"source\": \"geobase_mtl\"}, {\"i...  2016-09-09 18:22:22   \n",
       "2  [{\"id\": 1240379, \"source\": \"geobase_mtl\"}, {\"i...  2016-09-09 23:41:59   \n",
       "3  [{\"id\": 5640, \"source\": \"reseau_cyclable\"}, {\"...  2016-09-10 10:29:44   \n",
       "4  [{\"id\": 1240255, \"source\": \"geobase_mtl\"}, {\"i...  2016-09-10 13:06:26   \n",
       "\n",
       "               endtime        startx  ...    precip       temp   distance_m  \\\n",
       "0  2016-09-08 19:53:41  7.632056e+06  ...  0.000134  25.844886  1843.264582   \n",
       "1  2016-09-09 18:36:26  7.628002e+06  ...  0.001427  24.930720  2761.792383   \n",
       "2  2016-09-10 00:02:10  7.628518e+06  ...  0.001429  21.769356  1068.301088   \n",
       "3  2016-09-10 10:50:50  7.628223e+06  ...  0.000000  16.639258  1394.114250   \n",
       "4  2016-09-10 13:16:29  7.629631e+06  ...  0.000000  21.759996   552.535139   \n",
       "\n",
       "   weekday  morning  midday  afternoon  evening  midnight  \\\n",
       "0        1        0       0          0        1         0   \n",
       "1        1        0       0          0        1         0   \n",
       "2        1        0       0          0        0         1   \n",
       "3        0        1       0          0        0         0   \n",
       "4        0        0       1          0        0         0   \n",
       "\n",
       "                                            geometry  \n",
       "0  LINESTRING (7632055.840015979 1247584.15415876...  \n",
       "1  LINESTRING (7628002.075274516 1247761.31724215...  \n",
       "2  LINESTRING (7628517.528697006 1246292.61362129...  \n",
       "3  LINESTRING (7628222.927915867 1247461.40768243...  \n",
       "4  LINESTRING (7629631.088157224 1245856.46655086...  \n",
       "\n",
       "[5 rows x 23 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpd.read_file(path_final_2016).head(5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>id_trip</th>\n",
       "      <th>mode</th>\n",
       "      <th>purpose</th>\n",
       "      <th>starttime</th>\n",
       "      <th>endtime</th>\n",
       "      <th>startx</th>\n",
       "      <th>starty</th>\n",
       "      <th>endx</th>\n",
       "      <th>endy</th>\n",
       "      <th>precip</th>\n",
       "      <th>temp</th>\n",
       "      <th>distance_m</th>\n",
       "      <th>duration</th>\n",
       "      <th>weekday</th>\n",
       "      <th>morning</th>\n",
       "      <th>midday</th>\n",
       "      <th>afternoon</th>\n",
       "      <th>evening</th>\n",
       "      <th>midnight</th>\n",
       "      <th>geometry</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>150744</td>\n",
       "      <td>2</td>\n",
       "      <td>3</td>\n",
       "      <td>2017-09-18 10:02:50</td>\n",
       "      <td>2017-09-18 10:17:12</td>\n",
       "      <td>7.624322e+06</td>\n",
       "      <td>1.247673e+06</td>\n",
       "      <td>7.631864e+06</td>\n",
       "      <td>1.250415e+06</td>\n",
       "      <td>0.000000e+00</td>\n",
       "      <td>16.910884</td>\n",
       "      <td>9935.922336</td>\n",
       "      <td>862</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7624322.265039734 1247672.97005955...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>35763</td>\n",
       "      <td>2</td>\n",
       "      <td>2</td>\n",
       "      <td>2017-09-18 11:32:54</td>\n",
       "      <td>2017-09-18 12:04:07</td>\n",
       "      <td>7.641919e+06</td>\n",
       "      <td>1.236661e+06</td>\n",
       "      <td>7.641941e+06</td>\n",
       "      <td>1.236732e+06</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>6832.113937</td>\n",
       "      <td>1873</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7641918.591122853 1236660.83022969...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>323826</td>\n",
       "      <td>2</td>\n",
       "      <td>5</td>\n",
       "      <td>2017-09-18 12:25:08</td>\n",
       "      <td>2017-09-18 12:44:33</td>\n",
       "      <td>7.625699e+06</td>\n",
       "      <td>1.248427e+06</td>\n",
       "      <td>7.616671e+06</td>\n",
       "      <td>1.252917e+06</td>\n",
       "      <td>9.972328e-07</td>\n",
       "      <td>18.007062</td>\n",
       "      <td>12233.968564</td>\n",
       "      <td>1165</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7625699.094351658 1248426.57008442...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>375668</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2017-09-18 13:15:20</td>\n",
       "      <td>2017-09-18 13:29:00</td>\n",
       "      <td>7.630948e+06</td>\n",
       "      <td>1.253394e+06</td>\n",
       "      <td>7.630941e+06</td>\n",
       "      <td>1.253445e+06</td>\n",
       "      <td>1.495849e-06</td>\n",
       "      <td>20.940647</td>\n",
       "      <td>3612.405991</td>\n",
       "      <td>820</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>(LINESTRING (7633050.090248233 1252807.0590779...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>212877</td>\n",
       "      <td>2</td>\n",
       "      <td>0</td>\n",
       "      <td>2017-09-18 13:39:44</td>\n",
       "      <td>2017-09-18 14:01:40</td>\n",
       "      <td>7.631318e+06</td>\n",
       "      <td>1.252962e+06</td>\n",
       "      <td>7.646416e+06</td>\n",
       "      <td>1.264378e+06</td>\n",
       "      <td>1.495849e-06</td>\n",
       "      <td>23.092603</td>\n",
       "      <td>26428.385191</td>\n",
       "      <td>1316</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>LINESTRING (7631317.888935089 1252962.18975037...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   id_trip  mode  purpose            starttime              endtime  \\\n",
       "0   150744     2        3  2017-09-18 10:02:50  2017-09-18 10:17:12   \n",
       "1    35763     2        2  2017-09-18 11:32:54  2017-09-18 12:04:07   \n",
       "2   323826     2        5  2017-09-18 12:25:08  2017-09-18 12:44:33   \n",
       "3   375668     2        0  2017-09-18 13:15:20  2017-09-18 13:29:00   \n",
       "4   212877     2        0  2017-09-18 13:39:44  2017-09-18 14:01:40   \n",
       "\n",
       "         startx        starty          endx          endy        precip  \\\n",
       "0  7.624322e+06  1.247673e+06  7.631864e+06  1.250415e+06  0.000000e+00   \n",
       "1  7.641919e+06  1.236661e+06  7.641941e+06  1.236732e+06  9.972328e-07   \n",
       "2  7.625699e+06  1.248427e+06  7.616671e+06  1.252917e+06  9.972328e-07   \n",
       "3  7.630948e+06  1.253394e+06  7.630941e+06  1.253445e+06  1.495849e-06   \n",
       "4  7.631318e+06  1.252962e+06  7.646416e+06  1.264378e+06  1.495849e-06   \n",
       "\n",
       "        temp    distance_m  duration  weekday  morning  midday  afternoon  \\\n",
       "0  16.910884   9935.922336       862        1        1       0          0   \n",
       "1  18.007062   6832.113937      1873        1        0       1          0   \n",
       "2  18.007062  12233.968564      1165        1        0       1          0   \n",
       "3  20.940647   3612.405991       820        1        0       1          0   \n",
       "4  23.092603  26428.385191      1316        1        0       0          1   \n",
       "\n",
       "   evening  midnight                                           geometry  \n",
       "0        0         0  LINESTRING (7624322.265039734 1247672.97005955...  \n",
       "1        0         0  LINESTRING (7641918.591122853 1236660.83022969...  \n",
       "2        0         0  LINESTRING (7625699.094351658 1248426.57008442...  \n",
       "3        0         0  (LINESTRING (7633050.090248233 1252807.0590779...  \n",
       "4        0         0  LINESTRING (7631317.888935089 1252962.18975037...  "
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gpd.read_file(path_final_2017).head(5)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## create csv for lat/lon of end points"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "X_all = pd.concat([X_16, X_17],axis=0)\n",
    "y_all = pd.concat([y_16, y_17],axis=0)\n",
    "\n",
    "X_16['geometry'] = X_16.apply(lambda row: shapely.geometry.Point(row.endx, row.endy), axis=1)\n",
    "X_17['geometry'] = X_17.apply(lambda row: shapely.geometry.Point(row.endx, row.endy), axis=1)\n",
    "X_all['geometry'] = X_all.apply(lambda row: shapely.geometry.Point(row.endx, row.endy), axis=1)\n",
    "\n",
    "gX_16 = gpd.GeoDataFrame(X_16, crs=\"EPSG:3347\")\n",
    "gX_17 = gpd.GeoDataFrame(X_17, crs=\"EPSG:3347\")\n",
    "gX_all = gpd.GeoDataFrame(X_all, crs=\"EPSG:3347\")\n",
    "\n",
    "gX_16 = gX_16.to_crs('EPSG:4326')\n",
    "gX_17 = gX_17.to_crs('EPSG:4326')\n",
    "gX_all = gX_all.to_crs('EPSG:4326')\n",
    "\n",
    "gX_16['long'] = gX_16['geometry'].apply(lambda row: row.x)\n",
    "gX_16['lat'] = gX_16['geometry'].apply(lambda row: row.y)\n",
    "\n",
    "gX_17['long'] = gX_17['geometry'].apply(lambda row: row.x)\n",
    "gX_17['lat'] = gX_17['geometry'].apply(lambda row: row.y)\n",
    "\n",
    "gX_all['long'] = gX_all['geometry'].apply(lambda row: row.x)\n",
    "gX_all['lat'] = gX_all['geometry'].apply(lambda row: row.y)\n",
    "\n",
    "gX_16[['id_trip','long','lat']].to_csv('../../Data/model_inputs/end_coords_2016.csv', index=False)\n",
    "gX_17[['id_trip','long','lat']].to_csv('../../Data/model_inputs/end_coords_2017.csv', index=False)\n",
    "gX_all[['id_trip','long','lat']].to_csv('../../Data/model_inputs/end_coords_both.csv', index=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
